parser grammar AnasintGDL;

options {
  language = Java;
  tokenVocab = AnalexGDL;
}

@header {
  package practica6;
}


@members {
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
}


entrada: GRAPH DOS_PUNTOS LLAVE_A (nodo|arista|COMENTARIO)* LLAVE_C;

nodo: NODE DOS_PUNTOS LLAVE_A contenido_nodo LLAVE_C;

contenido_nodo: (title label borderstyle?)|(label title borderstyle?);

title: TITLE DOS_PUNTOS CADENA;

label: LABEL DOS_PUNTOS CADENA;

borderstyle: BORDERSTYLE DOS_PUNTOS BORDER;

arista: EDGE DOS_PUNTOS LLAVE_A contenido_arista LLAVE_C;

contenido_arista: (source target arrowstyle)|(target source arrowstyle)|(target arrowstyle source)|(arrowstyle source target);

source: SOURCE DOS_PUNTOS CADENA;

target: TARGET DOS_PUNTOS CADENA;

arrowstyle: ARROWSTYLE DOS_PUNTOS ARROW;
